home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / simplews.zip / simple client / CLIENT.C next >
C/C++ Source or Header  |  2001-11-07  |  4KB  |  226 lines

  1. #include <winsock.h>
  2. #include <stdio.h>
  3. #include <memory.h>
  4. #include <string.h>
  5.  
  6. #define MAX_TIMEOUT_SECONDS            6
  7. #define MAX_TIMEOUT_MILLISECONDS        230000
  8.  
  9. #define SUCCESS 0
  10.  
  11. int sosCleanup( SOCKET *pSocket );
  12. int sosConnect( SOCKET *pSocket, char *pAddress, int pPort );
  13. int sosSend( SOCKET *pSocket, const char* pBuffer, int pSize );
  14. int sosRecv( SOCKET *pSocket, const char* pBuffer, int pSize );
  15. int sosStartup( void );
  16.  
  17. void main( void )
  18. {
  19.     SOCKET pSocket = INVALID_SOCKET;
  20.  
  21.     char    teste[10] = "TESTE";
  22.  
  23.         printf( "Inicio\n" );
  24.  
  25.     if( sosStartup() )
  26.     {
  27.                 printf( "Erro em Startup\n" );
  28.         return;
  29.     }
  30.  
  31.         printf( "sosStartup Ok\n" );
  32.  
  33.     if( sosConnect( &pSocket, "192.168.5.1", 1234 ) )
  34.     {
  35.                 printf( "Erro em connect\n" );
  36.         return;
  37.     }
  38.  
  39.         printf( "sosConnect Ok socket = %d\n", pSocket );
  40.  
  41.     if( sosSend( &pSocket, teste, strlen(teste) ) )
  42.     {
  43.         printf( "Erro no envio\n" );
  44.         sosCleanup( &pSocket );
  45.         return;
  46.     }
  47.  
  48.         printf( "sosSend Ok" );
  49.  
  50.     memset( teste, 0, sizeof(teste) );
  51.  
  52.     if( !sosRecv( &pSocket, teste, sizeof(teste)-1 ) )
  53.     {
  54.         printf( "Erro no receive\n" );
  55.     }
  56.     else
  57.     {
  58.         printf( "teste = %s\n", teste );
  59.     }
  60.  
  61.     sosCleanup( &pSocket );
  62. }
  63.  
  64.  
  65. int sosStartup( void )
  66. {
  67.     WORD wVersionRequested;
  68.     WSADATA wsaData;
  69.     int err;
  70.  
  71.     wVersionRequested = MAKEWORD( 1, 1 );
  72.     
  73.     err = WSAStartup( wVersionRequested, &wsaData );
  74.     
  75.     if( err != 0 ) 
  76.     {
  77.         return err;
  78.     }
  79.  
  80.     if( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 )
  81.     {
  82.       WSACleanup();
  83.       return WSAVERNOTSUPPORTED;
  84.   }
  85.  
  86.     if(    LOBYTE( wVersionRequested ) < 1 ||
  87.             ( LOBYTE( wVersionRequested ) == 1 && HIBYTE( wVersionRequested ) < 1 ) )
  88.     {
  89.         WSACleanup( );
  90.         return WSAEINVAL;
  91.     }
  92.  
  93.     return SUCCESS;
  94. }
  95.  
  96. int sosCleanup( SOCKET *pSocket )
  97. {
  98.     if( *pSocket && *pSocket != INVALID_SOCKET )
  99.     {
  100.         shutdown( *pSocket, 2 );
  101.         closesocket( *pSocket );
  102.     }
  103.  
  104.     return WSACleanup();
  105. }
  106.  
  107. int sosConnect( SOCKET *pSocket, char *pAddress, int pPort )
  108. {
  109.     struct sockaddr_in sa_dest;
  110.  
  111.     *pSocket = socket( AF_INET, SOCK_STREAM, 0 );
  112.  
  113.     if( *pSocket == INVALID_SOCKET )
  114.     {
  115.             return INVALID_SOCKET;
  116.     }
  117.  
  118.     sa_dest.sin_family = AF_INET;
  119.     sa_dest.sin_addr.s_addr = inet_addr(pAddress);
  120.     sa_dest.sin_port = htons( pPort );
  121.  
  122.     return connect( *pSocket, (struct sockaddr *)&sa_dest, (int)sizeof(struct sockaddr) );
  123. }
  124.  
  125.  
  126. int sosSend( SOCKET *pSocket, const char* pBuffer, int pSize )
  127. {
  128.     struct timeval    Timeout;
  129.  
  130.     fd_set    writefds;
  131.  
  132.     int     Select = 0;
  133.     
  134.     Timeout.tv_sec  = MAX_TIMEOUT_SECONDS;
  135.     Timeout.tv_usec = MAX_TIMEOUT_MILLISECONDS;
  136.  
  137.     FD_ZERO( &writefds );
  138.     FD_SET( *pSocket, &writefds );
  139.  
  140.         printf( "Select em socket %d\n", *pSocket );
  141.  
  142.     Select = select( *pSocket, NULL, &writefds, NULL, &Timeout );
  143.  
  144.         printf( "select = %d\n", Select );
  145.  
  146.     if( Select == 0 )
  147.     {
  148.         return WSAETIMEDOUT;
  149.     }
  150.  
  151.     if( Select < 0 )
  152.     {
  153.         return Select;
  154.     }
  155.  
  156.     Select = send( *pSocket, pBuffer, pSize, 0 );
  157.  
  158.     if( Select == pSize )
  159.     {
  160.         return SUCCESS;
  161.     }
  162.  
  163.     return Select;
  164. }
  165.  
  166.  
  167. int sosRecv( SOCKET *pSocket, const char *pBuffer, int pSize )
  168. {
  169.     fd_set    readfds;
  170.  
  171.     unsigned char    mAuxData[4096];
  172.     
  173.     int    Bytes        = 0,
  174.             Offset    = 0,
  175.             Select    = 0,
  176.             Total   = 0;
  177.     
  178.     struct timeval Timeout;
  179.  
  180.     Timeout.tv_sec  = MAX_TIMEOUT_SECONDS;
  181.     Timeout.tv_usec = MAX_TIMEOUT_MILLISECONDS;
  182.  
  183.     memset( mAuxData, 0, sizeof(mAuxData) );
  184.  
  185.     while( 1 )
  186.     {
  187.         FD_ZERO( &readfds );
  188.         FD_SET( *pSocket, &readfds );
  189.  
  190.         Select= select( *pSocket, &readfds, NULL, NULL, &Timeout );
  191.  
  192.         if( Select > 0 )
  193.         {
  194.             memset( mAuxData, 0, sizeof(mAuxData) );
  195.  
  196.             Bytes = recv( *pSocket, (char *)mAuxData, (int)sizeof(mAuxData)-(int)(sizeof(char) * 1 ), 0 );
  197.  
  198.             if( Total + Bytes > pSize )
  199.             {
  200.                 return Total;
  201.             }
  202.  
  203.             if( Bytes > 0 )
  204.             {
  205.                 memcpy( (char *)(pBuffer+Offset), (char *)mAuxData, Bytes );
  206.                 Offset += Bytes;
  207.                 Total += Bytes;
  208.             }
  209.             else
  210.             {
  211.                 return Total;
  212.             }
  213.         }
  214.         else
  215.         {
  216.             return Total;
  217.         }
  218.  
  219.         Timeout.tv_sec = 0;
  220.     }
  221.     
  222.     return Total;
  223. }
  224.  
  225.  
  226.